package com.chenjt.six_rag;

import com.chenjt.six_rag.utils.MyDocumentSplitter;
import com.chenjt.three_tools.ModelUtil;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentParser;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.store.embedding.redis.RedisEmbeddingStore;

import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * 注释：将meituan-question.txt这个知识库内容向量化后存储在redis中
 *
 * @author chenjt
 * @date 2025/3/10 16:47
 */
public class MeituanRagLoader {

    public static void main(String[] args) throws URISyntaxException {

        //1.读取本地知识文件
        Path documentPath = Paths.get(MeituanRagLoader.class.getClassLoader().getResource("meituan-question.txt").toURI());
        DocumentParser documentParser = new TextDocumentParser();
        Document document = FileSystemDocumentLoader.loadDocument(documentPath, documentParser);
        //2.把知识文件分解成一个一个的知识条目
        DocumentSplitter splitter = new MyDocumentSplitter();
        List<TextSegment> segments = splitter.split(document);
        //3.对每个条目进行文本向量化，并且保存到Redis中
        // 运行之前先redis-cli连进去，清空所有数据：flushall
        EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
                .apiKey(ModelUtil.API_KEY)
                .baseUrl(ModelUtil.BASE_URL)
                .build();

        RedisEmbeddingStore embeddingStore = RedisEmbeddingStore.builder()
                .host("127.0.0.1")
                .port(6379)
                .dimension(1536)// 这里因为embeddingModel维度是1536，所以这里写1536
                /**
                 * redis-cli命令行，以下命令需要安装stack
                 * FT._LIST：能看到索引列表
                 * FT.INFO meituan-rag：列出meituan-rag这个索引的详细信息
                 */
                .indexName("meituan-rag")
                .build();

        List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
        // 第一个参数：将向量内存存储进去，第二个参数：将文本存储进去（用户提问时是通过文本输入的）
        embeddingStore.addAll(embeddings,segments);


    }

}
